/*************************************************************************
 *
 *  The Contents of this file are made available subject to the terms of
 *  either of the following licenses
 *
 *         - GNU Lesser General Public License Version 2.1
 *         - Sun Industry Standards Source License Version 1.1
 *
 *  Sun Microsystems Inc., October, 2000
 *
 *  GNU Lesser General Public License Version 2.1
 *  =============================================
 *  Copyright 2000 by Sun Microsystems, Inc.
 *  901 San Antonio Road, Palo Alto, CA 94303, USA
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *  MA  02111-1307  USA
 *
 *
 *  Sun Industry Standards Source License Version 1.1
 *  =================================================
 *  The contents of this file are subject to the Sun Industry Standards
 *  Source License Version 1.1 (the "License"); You may not use this file
 *  except in compliance with the License. You may obtain a copy of the
 *  License at http://www.openoffice.org/license.html.
 *
 *  Software provided under this License is provided on an "AS IS" basis,
 *  WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 *  WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
 *  MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
 *  See the License for the specific provisions governing your rights and
 *  obligations concerning the Software.
 *
 *  The Initial Developer of the Original Code is: IBM Corporation
 *
 *  Copyright: 2008 by IBM Corporation
 *
 *  All Rights Reserved.
 *
 *  Contributor(s): _______________________________________
 *
 *
 ************************************************************************/
/*************************************************************************
 * @file 
 *  For LWP filter architecture prototype
 ************************************************************************/
/*************************************************************************
 * Change History
 Jan 2005			Created
 ************************************************************************/

#ifndef _LWPLAYOUT_HXX
#define _LWPLAYOUT_HXX

#include "lwpheader.hxx"
#include "lwpobj.hxx"
#include "lwpobjhdr.hxx"
#include "lwpobjstrm.hxx"
#include "lwpobjid.hxx"
#include "lwpdlvlist.hxx"
#include "lwpfilehdr.hxx"

#include "lwplayoutdef.hxx"
#include "xfilter/xfdefs.hxx"
#include "xfilter/xfpagemaster.hxx"
#include "xfilter/xfcolumns.hxx"
#include "xfilter/xfborders.hxx"
#include "xfilter/xfframestyle.hxx"
#include "xfilter/xfframe.hxx"
#include "xfilter/xfbgimage.hxx"
#include "lwpusewhen.hxx"

#define ANCHOR_HEIGHT 		0x120000
#define FIRST_LAYOUTPAGENO	0x0001
#define LAST_LAYOUTPAGENO		0xffff

#define LAY_BUOYFLOAT 		0x01
#define LAY_BUOYNEUTRAL		0x02
#define	LAY_BUOYSINK 		0x03
#define	LAY_BUOYLAYER 		0x80

class LwpPara;
class LwpVirtualLayout : public LwpDLNFPVList
{
public:
	LwpVirtualLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm);
	virtual ~LwpVirtualLayout(){};
	virtual sal_Bool MarginsSameAsParent();
	inline virtual sal_uInt16 GetNumCols(){return 1;}
	virtual double GetColWidth(sal_uInt16 nIndex);
	virtual double GetColGap(sal_uInt16 nIndex);
	virtual double GetMarginsValue(const sal_uInt8& nWhichSide){return 0;}
	virtual double GetExtMarginsValue(const sal_uInt8& nWhichSide){return 0;}
	virtual sal_Bool IsAutoGrow(){ return sal_False;}
	virtual sal_Bool IsAutoGrowUp(){ return sal_False;}
	virtual sal_Bool IsAutoGrowDown(){ return sal_False;}
	virtual sal_Bool IsAutoGrowLeft(){ return sal_False;};
	virtual sal_Bool IsAutoGrowRight(){ return sal_False;};
	virtual sal_Bool IsFitGraphic();
	virtual sal_Bool IsAutoGrowWidth();
	virtual sal_Bool IsInlineToMargin();
	virtual sal_uInt8 GetContentOrientation(){ return TEXT_ORIENT_LRTB;}
	virtual sal_Bool HonorProtection();
	virtual sal_Bool IsProtected();
	virtual sal_Bool HasProtection();
	virtual OUString GetStyleName(){ return m_StyleName;}
	virtual sal_Bool IsComplex();
	virtual sal_Bool IsAnchorPage(){ return sal_False;}
	virtual sal_Bool IsAnchorFrame(){ return sal_False;}
	virtual sal_Bool IsAnchorCell(){ return sal_False;}
	virtual sal_Bool IsPage();
	virtual sal_Bool IsHeader();
	virtual sal_Bool IsFooter();
	virtual sal_Bool IsFrame();
	virtual sal_Bool IsCell();
	virtual sal_Bool IsSuperTable();
	virtual sal_Bool IsGroupHead();
	virtual sal_uInt8 GetRelativeType();
	virtual sal_Bool IsRelativeAnchored();
	virtual LwpUseWhen* GetUseWhen();
	virtual LwpUseWhen* VirtualGetUseWhen(){ return NULL;}
	virtual sal_Bool IsUseOnAllPages(){ return sal_False;}
	virtual sal_Bool IsUseOnAllEvenPages(){ return sal_False;}
	virtual sal_Bool IsUseOnAllOddPages(){ return sal_False;}
	virtual sal_Bool IsUseOnPage(){ return sal_False;}
	virtual sal_Int32 GetPageNumber(sal_uInt16 nLayoutNumber = 0){ return -1;}
	virtual sal_Bool IsMinimumHeight();
	virtual sal_Bool IsForWaterMark(){ return sal_False;}
	virtual LwpPara* GetLastParaOfPreviousStory() { return NULL; }
	virtual LwpVirtualLayout* GetParentLayout();
	virtual LwpVirtualLayout* GetContainerLayout(){ return NULL;}
	virtual void RegisterChildStyle();
	virtual sal_Bool NoContentReference();
	virtual sal_Bool IsStyleLayout();
	virtual enumXFAlignType GetVerticalAlignmentType() 
	{
		if (m_nAttributes & STYLE_CENTEREDVERTICALLY)
		{
			return enumXFAlignMiddle;
		}
		else if (m_nAttributes & STYLE_BOTTOMALIGNED)
		{
			return enumXFAlignBottom;
		}
		return enumXFAlignTop;
	};
	virtual void SetStyleName(const OUString & str){ m_StyleName = str;};
	virtual double GetWidth(){return -1;};	
	
	//Check whether there are contents in the layout
	virtual sal_Bool HasContent(){return sal_False;}
	//End by 
protected:
	void Read();	
protected:
	sal_uInt32 m_nAttributes;
	sal_uInt32 m_nAttributes2;
	sal_uInt32 m_nAttributes3;
	sal_uInt32 m_nOverrideFlag;
	sal_uInt16 m_nDirection;
	sal_uInt16 m_nEditorID;
	LwpObjectID m_NextEnumerated;
	LwpObjectID m_PreviousEnumerated;
	OUString m_StyleName;
	enum LWP_LAYOUT_TYPE
	{
		LWP_VIRTUAL_LAYOUT,
		LWP_HEAD_LAYOUT,
		LWP_PAGE_LAYOUT,
		LWP_HEADER_LAYOUT,
		LWP_FOOTER_LAYOUT,
		LWP_FRAME_LAYOUT,
		LWP_SUPERTABLE_LAYOUT,
		LWP_TABLE_LAYOUT,
		LWP_ROW_LAYOUT,
		LWP_COLUMN_LAYOUT,
		LWP_CELL_LAYOUT,
		LWP_CONNECTED_CELL_LAYOUT,
		LWP_HIDDEN_CELL_LAYOUT,
		LWP_TABLE_HEADING_LAYOUT,
		LWP_ROW_HEADING_LAYOUT,
		LWP_DROPCAP_LAYOUT,
		LWP_GROUP_LAYOUT,
		LWP_TOC_SUPERTABLE_LAYOUT,
		LWP_FOOTNOTE_LAYOUT,
		LWP_FOOTNOTE_ROW_LAYOUT,
		LWP_FOOTNOTE_CELL_LAYOUT,
		LWP_ENDNOTE_LAYOUT,
		LWP_ENDNOTE_SUPERTABLE_LAYOUT,
		LWP_FOOTNOTE_SUPERTABLE_LAYOUT,
		LWP_NOTE_LAYOUT,
		LWP_NOTEHEADER_LAYOUT,
		LWP_NOTETEXT_LAYOUT,
		LWP_VIEWPORT_LAYOUT
	};
	enum LayoutDirection
	{
		LAY_USEDIRECTION	= 0x01,
		LAY_AUTOGROW		= 0x02,
		LAY_AUTOSIZE		= 0x04,
		LAY_TOCONTAINER		= 0x08,
		LAY_DIRALLBITS		= 0x0f
	};
	enum	{SHIFT_UP = 0, SHIFT_DOWN = 4, SHIFT_LEFT = 8, SHIFT_RIGHT =12};
public:
	virtual LWP_LAYOUT_TYPE GetLayoutType () { return LWP_VIRTUAL_LAYOUT;}
	virtual LwpVirtualLayout* FindChildByType(LWP_LAYOUT_TYPE eType);
};

class LwpAssociatedLayouts
{
public:
	LwpAssociatedLayouts(){};
	//LwpAssociatedLayouts(LwpObjectStream* pStrm){Read(pStrm);};
public:
	void Read(LwpObjectStream* pStrm);
	LwpObjectID* GetOnlyLayout(){return &m_OnlyLayout;}
	LwpDLVListHeadTail* GetLayouts(){return &m_Layouts;}
	LwpVirtualLayout* GetLayout(LwpVirtualLayout* pStartLayout);
protected:
	LwpObjectID m_OnlyLayout; //LwpVirtualLayout
	LwpDLVListHeadTail m_Layouts;	
};

class LwpHeadLayout : public LwpVirtualLayout
{
public:
	LwpHeadLayout(LwpObjectHeader &objHdr, LwpSvStream* pStrm);
	virtual ~LwpHeadLayout(){};
	void RegisterStyle();
	LwpVirtualLayout* FindEnSuperTableLayout();
protected:
	void Read();
	virtual LWP_LAYOUT_TYPE GetLayoutType () { return LWP_HEAD_LAYOUT;}
};

//add by , 01/20/2005
class LwpLayoutStyle
{
public:
	LwpLayoutStyle();
	virtual ~LwpLayoutStyle();
	void Read(LwpObjectStream* pStrm);
private:
	sal_uInt32		m_nStyleDefinition;
	LwpAtomHolder*	m_pDescription;
	sal_uInt16		m_nKey;
};

class LwpLayoutMisc
{
public:
	LwpLayoutMisc();
	virtual ~LwpLayoutMisc();
	void Read(LwpObjectStream* pStrm);
private:
	sal_Int32	m_nGridDistance;
	sal_uInt16 m_nGridType;
	LwpAtomHolder* m_pContentStyle;
};
//end add

#include "lwplaypiece.hxx"

class LwpMiddleLayout : public LwpVirtualLayout
{
public:
	LwpMiddleLayout( LwpObjectHeader &objHdr, LwpSvStream* pStrm );
	virtual ~LwpMiddleLayout();
	virtual BOOL MarginsSameAsParent();
	virtual double GetMarginsValue(const sal_uInt8& nWhichSide);
	virtual double GetExtMarginsValue(const sal_uInt8& nWhichSide);	
	LwpLayoutGeometry* GetGeometry();
	double GetGeometryHeight();
	double GetGeometryWidth();
	LwpBorderStuff* GetBorderStuff();	
	LwpBackgroundStuff* GetBackgroundStuff();	
	enumXFTextDir GetTextDirection();	
	XFBorders* GetXFBorders();
	LwpColor* GetBackColor();
	virtual sal_Bool IsAutoGrow();
	virtual sal_Bool IsAutoGrowUp();
	virtual sal_Bool IsAutoGrowDown();
	virtual sal_Bool IsAutoGrowLeft();
	virtual sal_Bool IsAutoGrowRight();
	virtual sal_uInt8 GetContentOrientation();
	virtual sal_Bool HonorProtection();
	virtual sal_Bool IsProtected();
	virtual LwpVirtualLayout* GetWaterMarkLayout();
	XFBGImage* GetXFBGImage();
	virtual sal_Bool GetUsePrinterSettings();
	
	LwpLayoutScale* GetLayoutScale(){return static_cast<LwpLayoutScale*>(m_LayScale.obj());}
        sal_uInt16 GetScaleMode(void);
	void SetScaleMode(sal_uInt16 nVal);
	sal_uInt16 GetScaleTile(void);
	void SetScaleTile(sal_uInt16 nVal);
	sal_uInt16 GetScaleCenter(void);
	void SetScaleCenter(sal_uInt16 nVal);
	sal_uInt32 GetScalePercentage(void);
	void SetScalePercentage(sal_uInt32 nVal);
	double GetScaleWidth(void);
	void SetScaleWidth(double fVal);
	double GetScaleHeight(void);
	void SetScaleHeight(double fVal);

	sal_Bool CanSizeRight(void);
	virtual double GetWidth();	
	virtual sal_Int32 GetMinimumWidth();
	sal_Bool IsSizeRightToContent(void);
	sal_Bool IsSizeRightToContainer(void);
	sal_Int32 DetermineWidth();
	virtual double GetHeight();
	virtual LwpPoint GetOrigin(); 

	// added by , 06/01/2004
	sal_Bool IsPatternFill();
	XFBGImage* GetFillPattern();
	// end add

	
	//Check whether there are contents in the layout
	virtual sal_Bool HasContent();
	//End by 
	
protected:
	void Read();
protected:
	enum
	{
		DISK_GOT_STYLE_STUFF		= 0x01,
		DISK_GOT_MISC_STUFF			= 0x02
	};

	LwpObjectID m_Content;
	LwpObjectID m_BasedOnStyle;

	// 01/20/2005
	LwpObjectID		m_TabPiece;
	LwpLayoutStyle*	m_pStyleStuff;
	LwpLayoutMisc*	m_pMiscStuff;
	LwpObjectID		m_LayGeometry;
	LwpObjectID		m_LayScale;
	LwpObjectID		m_LayMargins;
	LwpObjectID		m_LayBorderStuff;
	LwpObjectID		m_LayBackgroundStuff;
	LwpObjectID		m_LayExtBorderStuff;
	//end
public:
	LwpObjectID* GetContent(){return &m_Content;}
	LwpTabOverride* GetTabOverride();
};

class LwpLayout : public LwpMiddleLayout
{
public:
	LwpLayout( LwpObjectHeader &objHdr, LwpSvStream* pStrm );
 	virtual ~LwpLayout();	
	XFColumns* GetXFColumns();
	XFColumnSep* GetColumnSep();
	LwpShadow* GetShadow();	
	XFShadow* GetXFShadow();
protected:
	void Read();
protected:
	// 01/20/2005
	LwpUseWhen*	m_pUseWhen;
	LwpObjectID	m_Positon;
	LwpObjectID	m_LayColumns;
	LwpObjectID	m_LayGutterStuff;
	LwpObjectID	m_LayJoinStuff;
	LwpObjectID	m_LayShadow;
	LwpObjectID	m_LayExtJoinStuff;
	//end

public:	
	LwpUseWhen* VirtualGetUseWhen();
	virtual sal_uInt16 GetNumCols();
	virtual double GetColWidth(sal_uInt16 nIndex);
	virtual double GetColGap(sal_uInt16 nIndex);
	virtual sal_uInt16 GetUsePage();
public:
	enum UseWhenType
	{
		StartWithinColume,
		StartWithinPage,
		StartOnNextPage,
		StartOnOddPage,
		StartOnEvenPage
	};
public:
	virtual UseWhenType GetUseWhenType();
	virtual sal_Bool IsUseOnAllPages();
	virtual sal_Bool IsUseOnAllEvenPages();	
	virtual sal_Bool IsUseOnAllOddPages();
	virtual sal_Bool IsUseOnPage();
	LwpObjectID* GetPosition(){ return &m_Positon;}
	virtual LwpVirtualLayout* GetContainerLayout();
};

class XFFont;
class LwpPlacableLayout : public LwpLayout
{
public:
	LwpPlacableLayout( LwpObjectHeader &objHdr, LwpSvStream* pStrm );
 	virtual ~LwpPlacableLayout();
	virtual sal_uInt8 GetWrapType();
	virtual LwpLayoutRelativity* GetRelativityPiece();
	virtual sal_uInt8 GetRelativeType();
	sal_uInt8 GetRelativeFromWhere();
	LwpPoint GetRelativeDistance();
	sal_uInt8 GetTetherType();
	sal_uInt8 GetTetherWhere();
	virtual sal_Int32 GetBaseLineOffset();
	virtual sal_Bool IsAnchorPage();
	virtual sal_Bool IsAnchorFrame();
	virtual sal_Bool IsAnchorCell();	
	virtual void XFConvertFrame(XFContentContainer* pCont, sal_Int32 nStart = 0, sal_Int32 nEnd = 0, sal_Bool bAll = sal_False){}
	XFFont* GetFont();
	void SetFont(XFFont* pFont);
	enum WrapType
	{
		LAY_WRAP_AROUND = 1,
		LAY_NO_WRAP_BESIDE,
		LAY_NO_WRAP_AROUND,
		LAY_WRAP_LEFT,
		LAY_WRAP_RIGHT,
		//OLD_LAY_WRAP_RIGHT,
		LAY_WRAP_BOTH,
		LAY_WRAP_IRREG_BOTH,
		LAY_WRAP_IRREG_LEFT,
		LAY_WRAP_IRREG_RIGHT,
		LAY_WRAP_IRREG_BIGGEST
	};	
protected:
	void Read();	
protected:
	sal_uInt8 m_nWrapType;
	sal_uInt8 m_nBuoyancy;
	sal_Int32 m_nBaseLineOffset;
	LwpAtomHolder m_Script;
	LwpObjectID m_LayRelativity;
	sal_uInt16 m_nPageNumber;//for frame anchored to page	
	XFFont* m_pFont;//for frame position
};
#endif
